package com.hjq.widget.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;

import com.hjq.widget.R;

/**
 * 空数据占位视图
 * 用于列表页面无数据时的占位显示
 * 
 * 使用示例：
 * <pre>
 * XML中使用：
 * {@code
 * <com.hjq.widget.view.EmptyView
 *     android:id="@+id/empty_view"
 *     android:layout_width="wrap_content"
 *     android:layout_height="wrap_content"
 *     android:layout_gravity="center"
 *     app:emptyImage="@mipmap/logo_big_icon"
 *     app:emptyText="暂无数据"
 *     app:emptyTextSize="14sp"
 *     app:emptyTextColor="@color/cb9"
 *     app:emptyImageSize="120dp"
 *     app:emptyTextMarginTop="20dp" />
 * }
 * 
 * 代码中使用：
 * {@code
 * EmptyView emptyView = findViewById(R.id.empty_view);
 * emptyView.setEmptyImage(R.mipmap.logo_big_icon);
 * emptyView.setEmptyText("暂无数据");
 * emptyView.show(); // 显示空状态
 * emptyView.hide(); // 隐藏空状态
 * }
 * </pre>
 */
public class EmptyView extends LinearLayout {

    /** 占位图片 */
    private ImageView ivEmpty;
    /** 提示文字 */
    private TextView tvEmpty;

    /** 图片大小 */
    private int imageSize;
    /** 文字上边距 */
    private int textMarginTop;

    public EmptyView(Context context) {
        this(context, null);
    }

    public EmptyView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public EmptyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        
        // 读取自定义属性
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.EmptyView);
        Drawable emptyImage = ta.getDrawable(R.styleable.EmptyView_emptyImage);
        String emptyText = ta.getString(R.styleable.EmptyView_emptyText);
        int emptyTextColor = ta.getColor(R.styleable.EmptyView_emptyTextColor, 0xFFCCCCCC);
        float emptyTextSize = ta.getDimension(R.styleable.EmptyView_emptyTextSize, sp2px(14));
        imageSize = ta.getDimensionPixelSize(R.styleable.EmptyView_emptyImageSize, dp2px(120));
        textMarginTop = ta.getDimensionPixelSize(R.styleable.EmptyView_emptyTextMarginTop, dp2px(20));
        ta.recycle();

        // 初始化布局
        initView(context);

        // 设置属性
        if (emptyImage != null) {
            ivEmpty.setImageDrawable(emptyImage);
        }
        if (emptyText != null) {
            tvEmpty.setText(emptyText);
        }
        tvEmpty.setTextColor(emptyTextColor);
        tvEmpty.setTextSize(TypedValue.COMPLEX_UNIT_PX, emptyTextSize);
    }

    /**
     * 初始化视图
     */
    private void initView(Context context) {
        // 设置布局方向和对齐方式
        setOrientation(VERTICAL);
        setGravity(Gravity.CENTER);

        // 创建图片视图
        ivEmpty = new ImageView(context);
        LayoutParams imageParams = new LayoutParams(imageSize, imageSize);
        ivEmpty.setLayoutParams(imageParams);
        ivEmpty.setScaleType(ImageView.ScaleType.FIT_CENTER);
        addView(ivEmpty);

        // 创建文字视图
        tvEmpty = new TextView(context);
        LayoutParams textParams = new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
        );
        textParams.topMargin = textMarginTop;
        tvEmpty.setLayoutParams(textParams);
        addView(tvEmpty);

        // 默认隐藏
        setVisibility(GONE);
    }

    /**
     * 设置占位图片
     * 
     * @param resId 图片资源ID
     */
    public void setEmptyImage(@DrawableRes int resId) {
        ivEmpty.setImageResource(resId);
    }

    /**
     * 设置占位图片
     * 
     * @param drawable 图片Drawable
     */
    public void setEmptyImage(Drawable drawable) {
        ivEmpty.setImageDrawable(drawable);
    }

    /**
     * 设置提示文字
     * 
     * @param text 提示文字
     */
    public void setEmptyText(CharSequence text) {
        tvEmpty.setText(text);
    }

    /**
     * 设置提示文字
     * 
     * @param resId 字符串资源ID
     */
    public void setEmptyText(@StringRes int resId) {
        tvEmpty.setText(resId);
    }

    /**
     * 设置提示文字颜色
     * 
     * @param color 颜色值
     */
    public void setEmptyTextColor(int color) {
        tvEmpty.setTextColor(color);
    }

    /**
     * 设置提示文字大小
     * 
     * @param size 文字大小（单位：sp）
     */
    public void setEmptyTextSize(float size) {
        tvEmpty.setTextSize(size);
    }

    /**
     * 设置图片大小
     * 
     * @param size 图片大小（单位：px）
     */
    public void setImageSize(int size) {
        LayoutParams params = (LayoutParams) ivEmpty.getLayoutParams();
        params.width = size;
        params.height = size;
        ivEmpty.setLayoutParams(params);
    }

    /**
     * 设置文字上边距
     * 
     * @param margin 上边距（单位：px）
     */
    public void setTextMarginTop(int margin) {
        LayoutParams params = (LayoutParams) tvEmpty.getLayoutParams();
        params.topMargin = margin;
        tvEmpty.setLayoutParams(params);
    }

    /**
     * 设置图片缩放类型
     * 
     * @param scaleType 缩放类型（如 FIT_CENTER、CENTER_INSIDE 等）
     */
    public void setImageScaleType(ImageView.ScaleType scaleType) {
        ivEmpty.setScaleType(scaleType);
    }

    /**
     * 显示空状态视图
     */
    public void show() {
        if (getVisibility() != VISIBLE) {
            setVisibility(VISIBLE);
        }
    }

    /**
     * 隐藏空状态视图
     */
    public void hide() {
        if (getVisibility() != GONE) {
            setVisibility(GONE);
        }
    }

    /**
     * 获取ImageView
     * 
     * @return ImageView实例
     */
    public ImageView getImageView() {
        return ivEmpty;
    }

    /**
     * 获取TextView
     * 
     * @return TextView实例
     */
    public TextView getTextView() {
        return tvEmpty;
    }

    /**
     * dp转px
     */
    private int dp2px(float dpValue) {
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                dpValue,
                getContext().getResources().getDisplayMetrics()
        );
    }

    /**
     * sp转px
     */
    private int sp2px(float spValue) {
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_SP,
                spValue,
                getContext().getResources().getDisplayMetrics()
        );
    }
}

